package tools;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import recherche.LancementAppli;



/**
 * Classe de racinisation (stemming) des mots
 * en fran�ais.
 * Modification l�g�re du package SnowBall
 * http://snowball.tartarus.org/download.php
 * @author xtannier
 *
 */
public class FrenchStemmer extends org.tartarus.snowball.ext.frenchStemmer implements Normalizer {

	private static short REPEAT = 1;
	
	private ArrayList<String> stopWords;
	
	public FrenchStemmer() {
		this.stopWords = new ArrayList<String>();
	}
	
	public FrenchStemmer(String stopWordFileName) throws IOException {
		this.stopWords = new ArrayList<String>();
		//lecture du fichier texte	
		InputStream ips=new FileInputStream(stopWordFileName); 
		InputStreamReader ipsr=new InputStreamReader(ips);
		BufferedReader br=new BufferedReader(ipsr);
		String line;
		while ((line=br.readLine())!=null){
			this.stopWords.add(line);
		}
		br.close(); 
	}

//	
//	public ArrayList<String> normalize(String fileName) throws IOException {		
//		String text = "";
//		//lecture du fichier texte	
//		InputStream ips=new FileInputStream(fileName); 
//		InputStreamReader ipsr=new InputStreamReader(ips);
//		BufferedReader br=new BufferedReader(ipsr);
//		String line;
//		while ((line=br.readLine())!=null){
//			text += line + " ";
//		}
//		br.close(); 
//		
//		ArrayList<String> words = (new FrenchTokenizer()).tokenize(text.toLowerCase());
//		ArrayList<String> result = new ArrayList<String>();
//		for (String word : words) {
//			// on ajoute le mot dans la liste s'il n'appartient pas � la liste des mots-cl�s.
//			// Id�alement il faudrait utiliser une structure de donn�es plus efficace que la liste,
//			// mais ce n'est pas le sujet.
//			this.setCurrent(word);
//			for (int i = REPEAT; i != 0; i--) {
//				this.stem();
//			}
//			result.add(this.getCurrent());
//		}
//		return result;
//	}
//
//	public static void main(String[] args) {
//		String stopWordFileName = "/Users/poko/Dropbox/Cours/S9/EIT/frenchST.txt";
//		String word = "/home/xtannier/tmp/texte.txt";
//		try {
//			Normalizer stemmer = new FrenchStemmer(stopWordFileName);
//			System.out.println(stemmer.normalize(word));
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	}
//
//	@Override
//	public ArrayList<String> normalize(String fileName, boolean removeStopWords)
//			throws IOException {
//		String text = "";
//		//lecture du fichier texte	
//		InputStream ips=new FileInputStream(fileName); 
//		InputStreamReader ipsr=new InputStreamReader(ips);
//		BufferedReader br=new BufferedReader(ipsr);
//		String line;
//		while ((line=br.readLine())!=null){
//			text += line + " ";
//		}
//		br.close(); 
//		
//		ArrayList<String> words = (new FrenchTokenizer()).tokenize(text.toLowerCase());
//		ArrayList<String> result = new ArrayList<String>();
//		for(String word : words){
//			if(!removeStopWords || !(this.stopWords.contains(word))){
//				this.setCurrent(word);
//				for (int i = REPEAT; i != 0; i--) {
//					this.stem();
//				}
//				result.add(this.getCurrent());
//			}
//		}
//		return null;
//	}

	//Surcharge m�thode de normalize pour enregistrer l'url et le titre de l'article
//	@Override
//	public ArrayList<String> normalize(String fileName, ArrayList<String> URL_title, boolean removeStopWords)throws IOException {
//		String text = "";
//		//lecture du fichier texte	
//		InputStream ips=new FileInputStream(fileName); 
//		InputStreamReader ipsr=new InputStreamReader(ips);
//		BufferedReader br=new BufferedReader(ipsr);
//		String line;
//		//Traitement du fichier:
//		line = br.readLine();
//		//R�cup�ration url
//		String[] url=line.split("URL=");
//		line = br.readLine();
//		//R�cuperation titre
//		String[] title=line.split("TITLE=");
//		//System.out.println(title[0] + " et " + title[1]);
//		if(title.length==0){
//			title = new String[2];
//			title[0] = " ";
//			title[1] = " ";
//		}
//		//Ajout url et titre dans un tableau
//		URL_title.add(url[1]);
//		URL_title.add(title[1]);
//		//Ajoute du titre dans le text a indexer
//		text += title[1];
//		while ((line=br.readLine())!=null){
//			text += line + " ";
//		}
//		br.close(); 
//		ArrayList<String> words = (new FrenchTokenizer()).tokenize(text.toLowerCase());
//		ArrayList<String> result = new ArrayList<String>();
//		for (String word : words) {
//			// on ajoute le mot dans la liste s'il n'appartient pas � la liste des mots-cl�s.
//			// Id�alement il faudrait utiliser une structure de donn�es plus efficace que la liste,
//			// mais ce n'est pas le sujet.
//			this.setCurrent(word);
//			for (int i = REPEAT; i != 0; i--) {
//				this.stem();
//			}
//			result.add(this.getCurrent());
//		}
//		return result;
//	}
	
	// Surcharge de normalize qui prend en parametre le contenu d'un fichier en ArrayList
		public ArrayList<String> normalize_ok(ArrayList<String> fileContent, ArrayList<String> URL_title, boolean removeStopWords, boolean doUrl) throws IOException {
			String text;	
			String line;		
			line = fileContent.get(0);
			//récupération URL
			String[] url=line.split("URL=");
			line = fileContent.get(1);	
			//Récuperation titre
			String[] title=line.split("TITLE=");
			if(title.length==0){
				title = new String[2];
				title[0] = " ";
				title[1] = " ";
			}
			if (doUrl){
				//Ajout url et titre dans un tableau
				URL_title.add(url[1]);
				URL_title.add(title[1]);
			}
			
			int i = 2;
			//Ajoute du titre dans le text a indexer
			text = title[1];
			while ( i < fileContent.size() ){
				text += fileContent.get(i) + " ";
				i++;
			}
			
			ArrayList<String> words = (new FrenchTokenizer(LancementAppli.STOP_WORDS)).tokenize(text.toLowerCase(), removeStopWords);
			ArrayList<String> result = new ArrayList<String>();
			for (String word : words) {
				// on ajoute le mot dans la liste s'il n'appartient pas � la liste des mots-cl�s.
				// Id�alement il faudrait utiliser une structure de donn�es plus efficace que la liste,
				// mais ce n'est pas le sujet.
				this.setCurrent(word);
				for (i = REPEAT; i != 0; i--) {
					this.stem();
				}
				result.add(this.getCurrent());
			}
			return result;
		}
		
		public ArrayList<String> normalize_req(ArrayList<String> contenuRequete, boolean removeStopWords) throws IOException {
			String text = "";
			int i = 0;
			while (i < contenuRequete.size()){
				text += contenuRequete.get(i) + " ";
				i++;
			}
			ArrayList<String> words = (new FrenchTokenizer(LancementAppli.STOP_WORDS)).tokenize(text.toLowerCase(), removeStopWords);
			ArrayList<String> result = new ArrayList<String>();
			for (String word : words) {
				// on ajoute le mot dans la liste s'il n'appartient pas � la liste des mots-cl�s.
				// Id�alement il faudrait utiliser une structure de donn�es plus efficace que la liste,
				// mais ce n'est pas le sujet.
				this.setCurrent(word);
				for (i = REPEAT; i != 0; i--) {
					this.stem();
				}
				result.add(this.getCurrent());
			}
			return result;
		}
		
}
